
/*
{
  //声明变量时的联合声明
  let a: (number | string) = 1
  a = '3'
  // a= null   不能将类型“null”分配给类型“string | number”。

  //函数接受的参数类型

  function fn(x: (number | string)) {
    console.log(x);
  }
  fn(2)
  fn('2')
  // fn(true)   类型“boolean”的参数不能赋给类型“string | number”的参数

  //定义一个函数获得传入的参数的长度

  //类型断言1.(x as string)  2.(<string>x)
  function fn1(x: (number | string)) {
    if ((x as string).length) {
      console.log((<string>x).length);
    } else {
      console.log(x.toString.length);

    }
  }

}
*/


//声明变量时的联合声明  
let a:(number|string) = 1
//函数接收参数时的联合声明
function fn(x:(number|string),y:(number|string)):(number|string){
  return 1
} 


function fn1(x:(number|string)){
  if((x as string).length){
    return (<string>x).length
  }else{
    return x.toString.length
  }
}

//类型别名,基本数据类型和数组
//先把数组的类型定义出来,将来在对象中使用

type numType = string[]
let b:numType = ['1','3','4']

//接口
//用来定义一个对象的类型,定义的时候,里面的属性和类型都是固定的

type arrType = string[]
interface objType {
  name:string,
  age:number
  arr1:arrType
}

let obj:objType = {
  name:'zhangsan',
  age:18,
  arr1:['1','3']
}


//函数类型
//声明函数是直接定义形参和返回值
function fn7(x:number,y:number,...rest:string[]):number{
return x+y
}

fn7(1,3,'3')

//函数表达式

let fn6 = (x:number,y:number):number=>{
  return x+y
}

//完整的函数类型
let fn5:(x:number,y:number)=>number = (x,y)=>{
  return x+y
}

//泛型


function get<T>(x:string,y:T){

}

interface objType1 {
  params:{
    name:string,
    age:number
  }
}

get<objType1>('/user',{
  params:{
    name:'张三',
    age:18
  }
})





